作業メモ CGEに準拠したAnimator Controllerの生成
レイヤーの生成
CgeLayerForBlinkingOverrideView.cs
アセットコンテナから CgeAacFlBase のインスタンスを取得して CgeAacFlBase.CreateSupportingArbitraryControllerLayer()を呼び出す
引数にUnityEditor.Animations.AnimatorControllerのインスタンスとレイヤー名を渡す
https://github.com/hai-vr/combo-gesture-expressions-av3/blob/V2.0.2/Assets/Hai/ComboGesture/Scripts/Editor/Internal/CgeLayerForBlinkingOverrideView.cs#L58
CgeAac.cs
CgeAacFlBase.CreateSupportingArbitraryControllerLayer() 内部でCgeAacFlBase.DoCreateLayer()を呼び出す
https://github.com/hai-vr/combo-gesture-expressions-av3/blob/V2.0.2/Assets/Hai/ComboGesture/Scripts/Editor/Internal/CgeAac/CgeAac.cs#L445
CgeAacAnimatorGenerator のインスタンスを生成
https://github.com/hai-vr/combo-gesture-expressions-av3/blob/V2.0.2/Assets/Hai/ComboGesture/Scripts/Editor/Internal/CgeAac/CgeAac.cs#L464
CgeAacAnimatorGeneratorのコンストラクタ
https://github.com/hai-vr/combo-gesture-expressions-av3/blob/V2.0.2/Assets/Hai/ComboGesture/Scripts/Editor/Internal/CgeAac/CgeAac.cs#L631
空のアニメーションクリップと、ICgeAacDefaultsProvider のインスタンスを渡している
ICgeAacDefaultsProvider のインスタンスは、ICgeAacDefaultsProvider.ConfigureStateMachine()を呼び出すために使われる
https://github.com/hai-vr/combo-gesture-expressions-av3/blob/V2.0.2/Assets/Hai/ComboGesture/Scripts/Editor/Internal/CgeAac/CgeAac.cs#L734
ICgeAacDefaultsProvider を実装したCgeAacDefaultsProviderは、デフォルト値を取得するためのクラス (Write Defaultsの値など)
https://github.com/hai-vr/combo-gesture-expressions-av3/blob/V2.0.2/Assets/Hai/ComboGesture/Scripts/Editor/Internal/CgeAac/CgeAacDefaultsProvider.cs
同名のクラスがCgeAssetContainerの内部でも定義されているが、CgeAssetContainer内でしか使用されていない
CgeAacDefaultsProvide.ConfigureStateMachine() では、ステートを配置する座標を設定している
CgeAacAnimatorGenerator.CreateOrRemakeLayerAtSameIndex()を呼び出してステートマシンを取得
https://github.com/hai-vr/combo-gesture-expressions-av3/blob/V2.0.2/Assets/Hai/ComboGesture/Scripts/Editor/Internal/CgeAac/CgeAac.cs#L464
ステートマシンは、Animator Controllerやそのレイヤーとは異なるオブジェクトなのか?
CgeAacFLStateMachineはCgeAacAnimatorNodeの派生クラス
https://github.com/hai-vr/combo-gesture-expressions-av3/blob/V2.0.2/Assets/Hai/ComboGesture/Scripts/Editor/Internal/CgeAac/CgeAacFlStates.cs#L112
UnityEditor.Animations.AnimatorStateMachineをメンバとして持つ
AnimatorStateMachineはUnityEditor.Animations.AnimatorControllerLayerのメンバ
つまりステートマシンはレイヤーの下位概念
AnimatorStateMachineはChildAnimatorStateMachine構造体の配列をメンバとして持つ
ChildAnimatorStateMachineはAnimatorStateMachine型 (stateMachine) とVector3型 (position) で構成されている
CgeAac.UndoDisable() がたびたび呼び出されている
https://github.com/hai-vr/combo-gesture-expressions-av3/blob/V2.0.2/Assets/Hai/ComboGesture/Scripts/Editor/Internal/CgeAac/CgeAac.cs#L99
リフレクションを使って対象 (state) のpushUndoメンバにfalseをセットしている
UndoEnable() は逆にpushUndoメンバにtrueをセットする
BindingFlags.Instanceはインスタンスメンバを指定するもの
リフレクションのBindingFlagsは一旦これだけ覚えておこう
つまりstaticでないフィールドやメソッド
staticメンバを理解する
stateの型 (T) は任意となっている (whereが指定されていない)
UnityCsReferenceのリポジトリを検索したところ、StateMachine.csとAnimatorController.cs に該当のメンバが存在した
https://github.com/Unity-Technologies/UnityCsReference/blob/2019.4.31f1/Editor/Mono/Animation/AnimatorController.cs#L22
https://github.com/Unity-Technologies/UnityCsReference/blob/2019.4.31f1/Editor/Mono/Animation/StateMachine.cs#L14
https://github.com/Unity-Technologies/UnityCsReference/blob/2019.4.31f1/Editor/Mono/Animation/StateMachine.cs#L65
https://github.com/Unity-Technologies/UnityCsReference/blob/2019.4.31f1/Editor/Mono/Animation/StateMachine.cs#L98
https://github.com/Unity-Technologies/UnityCsReference/blob/2019.4.31f1/Editor/Mono/Animation/StateMachine.cs#L233
StateMachine.cs において、pushUndoメンバはinternalであり、undoHandlerに値をセットするためのプロパティ
undoHandlerはPushUndoInNeeded型のprivateメンバ
pushUndoは他クラスからアクセスできるが、undoHandlerは他クラスからアクセスできない
undoHandler.DoUndo()がStateMachine.cs でたびたび呼び出されている
pushUndoがtrueの場合、 Undo.RegisterCompleteObjectUndo() が呼び出される
pushUndoがfalseの場合は、逆にオブジェクトがDirtyであるとマークされず、Undoに対応しないということになる
Undo/Redo およびシリアライズについて調査
C#のシリアライズについてのまとめ
Unityのシリアライズについてのまとめ
UnityのUndo/Redoについてのまとめ
SerializeReference属性についてのまとめ
TODO
UndoDisableとUndoEnableがCGE内でどのように使われているか調べる
Issueを検索してもヒットしなかった
UndoDisable
CgeAac.csとCgeAacFlStates.csで呼び出し
UndoEnable
CgeAac.cs で一度だけ呼び出し
Animator Controller生成を高速化するためにUndoを無効化するものだった
https://github.com/hai-vr/av3-animator-as-code/pull/31
#Unity